package malagaAcoge.controller.daos;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import com.sun.faces.taglib.jsf_core.IdTagParserImpl;

import malagaAcoge.model.entities.Demanda;
import malagaAcoge.utils.JPAUtils;

public class DemandaDao {
	private static JPAUtils jpaUtils;
	protected static EntityManager em;

	public DemandaDao() {
		jpaUtils = new JPAUtils();

	}

	@SuppressWarnings("unchecked")
	public static List<Demanda> findAll() {
		List<Demanda> demandas = new ArrayList<Demanda>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em.createQuery("select u from Demanda u order by u.fechaCreacion desc");
			demandas = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo findAllDemanda");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demandas;
	}

	public static Demanda findDemanda(int id) {
		Demanda demanda = null;
		try {
			em = jpaUtils.getEntityManager();
			demanda = (Demanda) em.find(Demanda.class, id);
		} catch (Exception e) {
			System.out.println("Error en metodo findDemanda");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demanda;

	}

	public static void createDemanda(Demanda demanda) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.persist(demanda);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo createDemanda:");
			e.printStackTrace();
		} finally {
			em.close();
		}

	}

	public static void updateDemanda(Demanda demanda) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(demanda);
			em.getTransaction().commit();

		} catch (Exception e) {
			System.out.println("Error en metodo updateDemanda:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void deleteDemanda(int idDemanda) {
		try {
			em = jpaUtils.getEntityManager();
			Demanda demanda = em.find(Demanda.class, idDemanda);
			if (demanda != null) {
				em.getTransaction().begin();
				em.remove(demanda);
				em.getTransaction().commit();
			}
		} catch (Exception e) {
			System.out.println("Error en metodo deleteDemanda:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void mergeDemanda(Demanda demanda) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(demanda);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo updateDemanda:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	@SuppressWarnings("unchecked")
	public static List<Demanda> findDemandasDeDepartamento(int idDepartamento) {
		List<Demanda> demandas = new ArrayList<Demanda>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Demanda d where d.tecnicoBean.departamentoBean.idDepartamento = :valor " +
							"order by d.fechaCreacion desc")
					.setParameter("valor", idDepartamento);
			demandas = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay demandas para el departamento: "
					+ idDepartamento);
		} catch (Exception e) {
			System.out.println("Error en metodo findDemandasDeDepartamento");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demandas;

	}

	@SuppressWarnings("unchecked")
	public static List<Demanda> findDemandasDeUsuario(int idDepartamento,
			int idUsuario) {
		List<Demanda> demandas = new ArrayList<Demanda>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Demanda d where d.tecnicoBean.departamentoBean.idDepartamento = :valor " +
							"and d.usuarioBean.idUsuario= :idUsuario order by d.fechaCreacion desc")
					.setParameter("valor", idDepartamento)
					.setParameter("idUsuario", idUsuario);
			demandas = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay demandas para el departamento: "
					+ idDepartamento);
		} catch (Exception e) {
			System.out.println("Error en metodo findDemandasDeUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demandas;
	}
	@SuppressWarnings("unchecked")
	public static List<Demanda> findDemandasDeUsuario(int idUsuario) {
		List<Demanda> demandas = new ArrayList<Demanda>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Demanda d where d.usuarioBean.idUsuario= :idUsuario order by d.fechaCreacion desc")
					.setParameter("idUsuario", idUsuario);
			demandas = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay demandas para el usuario: "
					+ idUsuario);
		} catch (Exception e) {
			System.out.println("Error en metodo findDemandasDeUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demandas;
	}

	public static List<Demanda> findPendientesDeDepartamento(int idDepartamento) {
		List<Demanda> demandas = new ArrayList<Demanda>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Demanda d where d.tecnicoBean.departamentoBean.idDepartamento = :valor " +
							" and d.estado = :estado order by d.fechaCreacion desc")
					.setParameter("valor", idDepartamento).setParameter("estado", "Activa");
			demandas = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay demandas para el departamento: "
					+ idDepartamento);
		} catch (Exception e) {
			System.out.println("Error en metodo findPendientesDeDepartamento");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demandas;
	}

	public static List<Demanda> findPendientes() {
		List<Demanda> demandas = new ArrayList<Demanda>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Demanda d where " +
							" d.estado = :estado order by d.fechaCreacion desc").setParameter("estado", "Activa");
			demandas = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay demandas para el departamento pendientes.");
		} catch (Exception e) {
			System.out.println("Error en metodo findPendientes");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return demandas;
	}
}
